#include "BlockQueue.hpp"
#include <unistd.h>
#include "Task.hpp"
int num = 0;
void *Production(void *args)
{
    BlockQueue<Task_t> *pbq = static_cast<BlockQueue<Task_t> *>(args);
    int i=1,j=1;
    while (true)
    {    
        Task_t t(i,j);
        std::cout<<t.DebugToString()<<std::endl;
        pbq->Equeue(t);
        std::cout<<"生产任务"<<std::endl;
        i++,j++;
    }
}
void *Consumption(void *args)
{
    BlockQueue<Task_t> *pbq = static_cast<BlockQueue<Task_t> *>(args);
    //std::cout << "这是一个消费者函数" << std::endl;
    while (true)
    {
        sleep(1);
        Task_t data=pbq->Pop();
        std::cout<<"执行任务"<<std::endl;
        data.Excute();
        std::cout<<data.ResultToString()<<std::endl;
    }
}
int main()
{
    BlockQueue<Task_t>* pbq=new BlockQueue<Task_t>();
    pthread_t c[2], p[3];
    pthread_create(&c[0], nullptr, Consumption, pbq);
    pthread_create(&c[1], nullptr, Consumption, pbq);
    pthread_create(&p[0], nullptr, Production, pbq);
    pthread_create(&p[1], nullptr, Production, pbq);
    pthread_create(&p[2], nullptr, Production, pbq);

    pthread_join(c[0], nullptr);
    pthread_join(c[1], nullptr);
    pthread_join(p[0], nullptr);
    pthread_join(p[1], nullptr);
    pthread_join(p[2], nullptr);

    return 0;
}



// void *Production(void *args)
// {
//     BlockQueue<int> *pbq = static_cast<BlockQueue<int> *>(args);
//     std::cout << "这是一个生产者函数" << std::endl;
//     while (true)
//     {
//         std::cout << "生产一个数据 " << num << std::endl;
//         pbq->Equeue(num);
//         num++;
//     }
// }
// void *Consumption(void *args)
// {
//     BlockQueue<int> *pbq = static_cast<BlockQueue<int> *>(args);
//     std::cout << "这是一个消费者函数" << std::endl;
//     while (true)
//     {
//         sleep(1);
//         int data=pbq->Pop();
//         std::cout << "消费一个数据 " << data<< std::endl;
//     }
// }